﻿Shader "Unlit/ShadowReceiver"
{
    Properties
    {
        _Color("Color", Color) = (1,1,1,1)
        _MainTex("Albedo", 2D) = "white" {}

        _Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5

        _Glossiness("Smoothness", Range(0.0, 1.0)) = 0.5
        _GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
        [Enum(Metallic Alpha,0,Albedo Alpha,1)] _SmoothnessTextureChannel ("Smoothness texture channel", Float) = 0

        [Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
        _MetallicGlossMap("Metallic", 2D) = "white" {}

        [ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
        [ToggleOff] _GlossyReflections("Glossy Reflections", Float) = 1.0

        _BumpScale("Scale", Float) = 1.0
        [Normal] _BumpMap("Normal Map", 2D) = "bump" {}

        _Parallax ("Height Scale", Range (0.005, 0.08)) = 0.02
        _ParallaxMap ("Height Map", 2D) = "black" {}

        _OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
        _OcclusionMap("Occlusion", 2D) = "white" {}

        _EmissionColor("Color", Color) = (0,0,0)
        _EmissionMap("Emission", 2D) = "white" {}

        _DetailMask("Detail Mask", 2D) = "white" {}

        _DetailAlbedoMap("Detail Albedo x2", 2D) = "grey" {}
        _DetailNormalMapScale("Scale", Float) = 1.0
        [Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}

        [Enum(UV0,0,UV1,1)] _UVSec ("UV Set for secondary textures", Float) = 0


        // Blending state
        [HideInInspector] _Mode ("__mode", Float) = 0.0
        [HideInInspector] _SrcBlend ("__src", Float) = 1.0
        [HideInInspector] _DstBlend ("__dst", Float) = 0.0
        [HideInInspector] _ZWrite ("__zw", Float) = 1.0
    }

    CGINCLUDE
        #define UNITY_SETUP_BRDF_INPUT MetallicSetup
    ENDCG

    SubShader
    {
        Tags { "RenderType"="Opaque" "PerformanceChecks"="False" }
        LOD 300
        // ------------------------------------------------------------------
        //  Shadow rendering pass
        Pass {
            Name "ShadowCaster"
            //Tags { "LightMode" = "ShadowCaster" }

            ZWrite On ZTest LEqual

            CGPROGRAM
// Upgrade NOTE: excluded shader from DX11; has structs without semantics (struct v2f members vertexLight)
#pragma exclude_renderers d3d11
            #pragma target 3.0

            // -------------------------------------


            #pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHAPREMULTIPLY_ON
            #pragma shader_feature_local _METALLICGLOSSMAP
            #pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
            #pragma shader_feature_local _PARALLAXMAP
            #pragma multi_compile_shadowcaster
            #pragma multi_compile_instancing
            // Uncomment the following line to enable dithering LOD crossfade. Note: there are more in the file to uncomment for other passes.
            //#pragma multi_compile _ LOD_FADE_CROSSFADE

            #pragma vertex vertShadowCaster
            #pragma fragment fragShadowCaster
            

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float4 vertexLight : LIGHT_POS;
            };

            float4x4 lightVP;
            sampler2D shadowMap;

            v2f vertShadowCaster (appdata v)
            {
                v2f o;
                o.vertexLight = mul(lightVP, mul(unity_ObjectToWorld, v.vertex));
                o.vertex = UnityObjectToClipPos(v.vertex);
                return o;
            }

            fixed4 fragShadowCaster (v2f i) : SV_Target
            {
                // sample the texture
                float2 uv = (i.vertexLight.xy / i.vertexLight.w + float2(1.0, 1.0)) * 0.5;
                float z = 0;
                if(uv.x >= 0 && uv.y >= 0 && uv.x <= 1 && uv.y <= 1)
                {
                    z = tex2D(shadowMap, uv);
                    if(z > i.vertex.z)
                    {
                        return fixed4(0.0, 0.0, 0.0, 1.0);
                    }
                    else
                    {
                        return fixed4(1.0, 1.0, 1.0, 1.0);
                    } 
                }
                else
                {
                    return fixed4(1.0, 0.0, 0.0, 1.0);
                }
            }
            

            ENDCG
        }
        
        // ------------------------------------------------------------------
        // Extracts information for lightmapping, GI (emission, albedo, ...)
        // This pass it not used during regular rendering.
        // Pass
        // {
        //     Name "META"
        //     Tags { "LightMode"="Meta" }

        //     Cull Off

        //     CGPROGRAM
        //     #pragma vertex vert_meta
        //     #pragma fragment frag_meta

        //     #pragma shader_feature _EMISSION
        //     #pragma shader_feature_local _METALLICGLOSSMAP
        //     #pragma shader_feature_local _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
        //     #pragma shader_feature_local _DETAIL_MULX2
        //     #pragma shader_feature EDITOR_VISUALIZATION

        //     #include "UnityStandardMeta.cginc"
        //     ENDCG
        // }
    }


    FallBack "VertexLit"
    CustomEditor "StandardShaderGUI"
}
